<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>JS的error处理</title>
</head>
<body>

<script>
  /* 
  目标: 进一步理解JS中的错误(Error)和错误处理
    mdn文档: https: //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Error

    1. 错误的类型
        Error: 所有错误的父类型
        ReferenceError: 引用的变量不存在
        TypeError: 数据类型不正确的错误
        RangeError: 数据值不在其所允许的范围内
        SyntaxError: 语法错误
    2. 错误处理
        捕获错误: try ... catch
        抛出错误: throw error
    3. 错误对象
        message属性: 错误相关信息
        stack属性: 函数调用栈记录信息
  */

  // 1. 常见的内置错误
  // 1). ReferenceError: 引用的变量不存在
  // console.log(a) // ReferenceError: a is not defined
  // console.log('-----') // 没有捕获error, 下面的代码不会执行

  // TypeError: 数据类型不正确的错误
  // let b
  // // console.log(b.xxx) // TypeError: Cannot read property 'xxx' of undefined
  // b = {}
  // b.xxx() // TypeError: b.xxx is not a function


  // RangeError: 数据值不在其所允许的范围内
  // function fn() {
  //   fn()
  // }
  // fn() // RangeError: Maximum call stack size exceeded

  // SyntaxError: 语法错误
  // const c = """" // SyntaxError: Unexpected string


  // 2. 错误处理
  // 捕获错误: try ... catch
  // try {
  //   let d
  //   console.log(d.xxx)
  // } catch (error) {
  //   console.log(error.message)
  //   console.log(error.stack)
  // }
  // console.log('出错之后')

  // 抛出错误: throw error
  function something() {
    if (Date.now()%2===1) {
      console.log('当前时间为奇数, 可以执行任务')
    } else { // 如果时间是偶数抛出异常, 由调用来处理
      throw new Error('当前时间为偶数无法执行任务')  
    }
  }

  // 捕获处理异常
  try {
    something()
  } catch (error) {
    alert(error.message)
  }


</script>
</body>
</html>